package cloud.misiro.module.system.service.permission;

import cloud.misiro.module.system.dal.dataobject.permission.RoleDO;
import cloud.misiro.module.system.dal.mysql.permission.RoleMapper;
import cloud.misiro.module.system.dal.redis.RedisKeyConstants;
import cloud.misiro.module.system.enums.permission.RoleCodeEnum;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.extra.spring.SpringUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * 角色 Service 实现类
 *
 * @author misiro
 */
@Service
@Slf4j
public class RoleServiceImpl implements RoleService{

    @Resource
    private RoleMapper roleMapper;

    /**
     * 获得角色列表
     *
     * @param ids 角色编号数组
     * @return 角色列表
     */
    @Override
    public List<RoleDO> getRoleList(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return Collections.emptyList();
        }
        return roleMapper.selectBatchIds(ids);
    }

    @Override
    @Cacheable(value= RedisKeyConstants.ROLE,key="#id",unless = "#result == null")
    public RoleDO getRoleFromCache(Long id) {
        return roleMapper.selectById(id);
    }

    /**
     * 判断角色编号数组中，是否有管理员
     *
     * @param ids 角色编号数组
     * @return 是否有管理员
     */
    @Override
    public boolean hasAnySuperAdmin(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return false;
        }
        RoleServiceImpl self = getSelf();
        return ids.stream().anyMatch(id -> {
            RoleDO role = self.getRoleFromCache(id);
            return role != null && RoleCodeEnum.isSuperAdmin(role.getCode());
        });
    }

    /**
     * 获得自身的代理对象，解决 AOP 生效问题
     *
     * @return 自己
     */
    private RoleServiceImpl getSelf() {
        return SpringUtil.getBean(getClass());
    }

}
